home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / lang / fst-31s / doc / lists.mod < prev    next >
Text File  |  1992-09-20  |  3KB  |  127 lines

  1. IMPLEMENTATION MODULE Lists;
  2.  
  3. (* (C) Copyright 1992 Fitted Software Tools. All rights reserved. *)
  4.  
  5. FROM Objects IMPORT
  6.     ALLOCATEOBJECT,     (* for NEW *)
  7.     DEALLOCATEOBJECT;   (* for DISPOSE *)
  8.  
  9.  
  10. (* IMPLEMENTATION *) CLASS LinkedListItem;
  11.  
  12.     next    :LinkedListItem;    (* linked list prev and next pointers *)
  13.     prev    :LinkedListItem;
  14.  
  15.     INIT                        (* prev & next = NIL means that we are  *)
  16.         next := NIL;            (* not in any list                      *)
  17.         prev := NIL;
  18.  
  19. END LinkedListItem;
  20.  
  21.  
  22.  
  23. (* IMPLEMENTATION *) CLASS LinkedList;
  24.  
  25.     first       :LinkedListItem;    (* first item in list                *)
  26.     curpos      :LinkedListItem;    (* item returned by getfirst/getnext *)
  27.     nextiscur   :BOOLEAN;           (* next getnext must return curpos   *)
  28.                                     (* nextiscur may be set by delete    *)
  29.  
  30.     PROCEDURE append( item :LinkedListItem );
  31.     VAR p :LinkedListItem;
  32.     BEGIN
  33.         IF (item.next <> NIL) OR (item.prev <> NIL) THEN
  34.             (* item is already in some list! *)
  35.             HALT;
  36.         END;
  37.         p := first;
  38.         IF p = NIL THEN
  39.             first := item
  40.         ELSE
  41.             WHILE p.next <> NIL DO
  42.                 p := p.next;
  43.             END;
  44.             item.prev := p;
  45.             p.next := item;
  46.         END;
  47.     END append;
  48.  
  49.     PROCEDURE getfirst( VAR item :LinkedListItem ) :BOOLEAN;
  50.     BEGIN
  51.         item := first;
  52.         curpos := first;
  53.         RETURN first <> NIL;
  54.     END getfirst;
  55.  
  56.     PROCEDURE getnext( VAR item :LinkedListItem ) :BOOLEAN;
  57.     BEGIN
  58.         IF nextiscur THEN
  59.             item := curpos;
  60.             nextiscur := FALSE;
  61.         ELSIF curpos <> NIL THEN
  62.             item := curpos.next;
  63.             curpos := item;
  64.         ELSE
  65.             item := NIL;
  66.         END;
  67.         RETURN item <> NIL;
  68.     END getnext;
  69.  
  70.     PROCEDURE delete( item :LinkedListItem );
  71.     BEGIN
  72.         IF item.next = NIL THEN
  73.             IF item.prev = NIL THEN
  74.                 first := NIL
  75.             ELSE
  76.                 item.prev.next := NIL
  77.             END
  78.         ELSE
  79.             IF item.prev = NIL THEN
  80.                 first := item.next;
  81.                 item.next.prev := NIL;
  82.             ELSE
  83.                 item.prev.next := item.next;
  84.                 item.next.prev := item.prev;
  85.             END;
  86.         END;
  87.         IF curpos = item THEN
  88.             IF item.prev <> NIL THEN
  89.                 curpos := item.prev
  90.             ELSE
  91.                 curpos := first;
  92.                 nextiscur := TRUE;
  93.             END;
  94.         END;
  95.         item.next := NIL;
  96.         item.prev := NIL;
  97.     END delete;
  98.  
  99.     PROCEDURE destroyList;
  100.     (*
  101.         We coded destroyList as a separate method (it is a static method)
  102.         instead of doing the work in DESTROY because we needed a work
  103.         variable 'anItem'. If we made anItem an attribute of the class,
  104.         we would be wasting space in every object of this class.
  105.     *)
  106.     VAR
  107.         anItem :LinkedListItem;
  108.     BEGIN
  109.         WHILE getfirst(anItem) DO
  110.             delete( anItem );
  111.             DISPOSE( anItem );
  112.         END;
  113.     END destroyList;
  114.  
  115.     INIT
  116.         first := NIL;           (* initialize all our attributes *)
  117.         curpos := NIL;
  118.         nextiscur := FALSE;
  119.  
  120.     DESTROY
  121.         destroyList;
  122.  
  123.  
  124. END LinkedList;
  125.  
  126.  
  127. END Lists.